/*
    JSON序列化工具
        1、提供JSON序列化和反序列化接口
*/
#pragma once
#include <iostream>
#include <sstream>
#include <jsoncpp/json/json.h>
#include <memory>

namespace ns_jsonrpc
{
    class JSON
    {
    public:
        // json格式序列化
        static bool serialize(const Json::Value &val, std::string &jsonStr)
        {
            // 实例化工厂类对象并生产派生类对象
            Json::StreamWriterBuilder swb;
            std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
        
            // 序列化
            std::stringstream ss;
            int ret = sw->write(val, &ss);
            if (ret != 0)
                return false;
            jsonStr = ss.str();
            return true;
        }

        // json格式反序列化
        static bool unSerialize(const std::string &jsonStr, Json::Value &val)
        {
            // 实例化工厂类对象并生产派生类对象
            Json::CharReaderBuilder crb;
            std::unique_ptr<Json::CharReader> cr(crb.newCharReader());
        
            // 反序列化
            std::string err;
            bool ret = cr->parse(jsonStr.c_str(), jsonStr.c_str() + jsonStr.size(), &val, &err);
            if (ret == false)
                return false;
            return true;
        }
    };
}